package com.gs.domain.wrapper;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.Observable;
import java.util.Set;
import java.util.Vector;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.gs.business.DBUtil;
import com.gs.domain.Entrate;
import com.gs.domain.IUtenti;
import com.gs.domain.SingleSpesa;
import com.gs.domain.Utenti;
import com.molinari.jdbcandroid.wrap.ConnectionAndroid;
import comi.gsi.command.javabeancommand.AbstractOggettoEntita;
import comi.gsi.command.javabeancommand.IWrapperEntity;
import comi.gsi.db.LineStackTracePrinter;

public class WrapUtenti extends Observable implements IWrapperEntity, IUtenti {

	private Utenti utente;

	public WrapUtenti() {
		utente = new Utenti();
	}

	@Override
	public Object selectById(final int id) {
		final Connection cn = DBUtil.getConnection();

		Utenti utente = null;
		try {
			ConnectionAndroid cnAndroid = (ConnectionAndroid) cn;
			String[] idUtentiString = new String[] { Integer.toString(id) };
			String orderBy = Utenti.NOME + " desc";

			String selection = Utenti.ID + " = ?";

			Cursor cursor = cnAndroid.getDb().query(Utenti.NOME_TABELLA, null, selection, idUtentiString, null, null, orderBy);
			if (cursor.moveToFirst()) {
				do {
					utente = new Utenti();
					setUtenteFromCursor(utente, cursor);
				} while (cursor.moveToNext());
			}

			if (cursor != null && !cursor.isClosed()) {
				cursor.close();
			}
			cnAndroid.close();
		} catch (Exception e) {
			Log.e(e.getClass().getName(), LineStackTracePrinter.scriviLineaDellErrore());
		}
		return utente;
	}

	private void setUtenteFromCursor(final Utenti utente, final Cursor rs) {
		utente.setidUtente(rs.getInt(0));
		utente.setNome(rs.getString(1));
		utente.setCognome(rs.getString(2));
		utente.setusername(rs.getString(3));
		utente.setpassword(rs.getString(4));
	}

	@Override
	public Iterator<Object> selectWhere(final String where) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Vector<Object> selectAll() {
		final Vector<Object> utenti = new Vector<Object>();
		final Connection cn = DBUtil.getConnection();
		final ConnectionAndroid cnAndroid = (ConnectionAndroid) cn;
		try {
			String orderBy = Utenti.USERNAME + " desc";
			Cursor cursor = cnAndroid.getDb().query(Utenti.NOME_TABELLA, null, null, null, null, null, orderBy);
			if (cursor.moveToFirst()) {
				do {
					Utenti utente = new Utenti();
					setUtenteFromCursor(utente, cursor);
					utenti.add(utente);
				} while (cursor.moveToNext());
			}

			if (cursor != null && !cursor.isClosed()) {
				cursor.close();
			}
			cnAndroid.close();
		} catch (Exception e) {
			
		}

		return utenti;
	}

	public Utenti utenteLogin(final String username, final String password) {

		ConnectionAndroid cnAndroid = (ConnectionAndroid) DBUtil.getConnection();;
		Utenti utente = null;

		String[] selectionArgs = new String[] { username, password };
		final SQLiteDatabase db = cnAndroid.getDb();
		Cursor cursor = db.query(Utenti.NOME_TABELLA, null, Utenti.USERNAME + " = ? AND " + Utenti.PASSWORD + " = ?", selectionArgs, null, null, null);

		while (cursor.moveToNext()) {
			utente = new Utenti();
			setUtenteFromCursor(utente, cursor);
		}

		return utente;
	}

	@Override
	public boolean insert(final Object oggettoEntita) {
		final ConnectionAndroid cnAndroid = (ConnectionAndroid) DBUtil.getConnection();;
		final SQLiteDatabase db = cnAndroid.getDb();

		final Utenti utente = (Utenti) oggettoEntita;

		ContentValues values = new ContentValues();
		values.put(Utenti.NOME, utente.getNomeEntita());
		values.put(Utenti.COGNOME, utente.getCognome());
		values.put(Utenti.USERNAME, utente.getusername());
		values.put(Utenti.PASSWORD, utente.getpassword());
		if (db.insert(Utenti.NOME_TABELLA, null, values) == -1) {
			return false;
		}

		DBUtil.chiudiElementiDb(cnAndroid, null);
		return true;

	}

	@Override
	public boolean delete(final int id) {

		ConnectionAndroid cnAndroid = (ConnectionAndroid) DBUtil.getConnection();;
		final SQLiteDatabase db = cnAndroid.getDb();
		String[] whereArgs = new String[] { Integer.toString(id) };
		if (db.delete(Utenti.NOME_TABELLA, Utenti.ID + " = ?", whereArgs) == -1) {
			return false;
		}

		DBUtil.chiudiElementiDb(cnAndroid, null);

		return true;
	}

	@Override
	public boolean update(final Object oggettoEntita) {
		ConnectionAndroid cnAndroid = (ConnectionAndroid) DBUtil.getConnection();;

		final SQLiteDatabase db = cnAndroid.getDb();
		Utenti utente = (Utenti) oggettoEntita;

		final ContentValues values = new ContentValues();
		values.put(Utenti.NOME, utente.getNomeEntita());
		values.put(Utenti.COGNOME, utente.getCognome());
		values.put(Utenti.USERNAME, utente.getusername());
		values.put(Utenti.PASSWORD, utente.getpassword());

		String[] whereArgs = new String[] { Integer.toString(utente.getidUtente()) };

		if (db.update(Utenti.NOME_TABELLA, values, Utenti.ID, whereArgs) == -1) {
			return false;
		}

		DBUtil.chiudiElementiDb(cnAndroid, null);

		return true;
	}

	@Override
	public boolean deleteAll() {
		ConnectionAndroid cnAndroid = (ConnectionAndroid) DBUtil.getConnection();;
		final SQLiteDatabase db = cnAndroid.getDb();
		if (db.delete(Utenti.NOME_TABELLA, "1", null) == -1) {
			return false;
		}

		DBUtil.chiudiElementiDb(cnAndroid, null);

		return true;
	}

	public Utenti selectByUserAndPass(final String user, final String pass) {
		ConnectionAndroid cnAndroid = (ConnectionAndroid) DBUtil.getConnection();;
		Utenti utente = null;
		try {

			String orderBy = Utenti.USERNAME + " desc";
			String selection = Utenti.USERNAME + " = ? and " + Utenti.PASSWORD + " = ?";
			String[] args = new String[] { user, pass };
			Cursor cursor = cnAndroid.getDb().query(Utenti.NOME_TABELLA, null, selection, args, null, null, orderBy);
			if (cursor.moveToFirst()) {
				do {
					utente = new Utenti();
					setUtenteFromCursor(utente, cursor);

				} while (cursor.moveToNext());
			}

			if (cursor != null && !cursor.isClosed()) {
				cursor.close();
			}
			cnAndroid.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return utente;

	}

	@Override
	public int getidUtente() {
		return utente.getidUtente();
	}

	@Override
	public void setidUtente(final int idUtente) {
		utente.setidUtente(idUtente);
	}

	@Override
	public String getpassword() {
		return utente.getpassword();
	}

	@Override
	public void setpassword(final String password) {
		utente.setpassword(password);
	}

	@Override
	public String getusername() {
		return utente.getusername();
	}

	@Override
	public void setusername(final String username) {
		utente.setusername(username);
	}

	@Override
	public Set<Entrate> getEntrates() {
		return utente.getEntrates();
	}

	@Override
	public void setEntrates(final Set<Entrate> entrates) {
		utente.setEntrates(entrates);
	}

	@Override
	public Set<SingleSpesa> getSingleSpesas() {
		return utente.getSingleSpesas();
	}

	@Override
	public void setSingleSpesas(final Set<SingleSpesa> singleSpesas) {
		utente.setSingleSpesas(singleSpesas);
	}

	@Override
	public void setNome(final String nome) {
		utente.setNome(nome);
	}

	@Override
	public String getNomeEntita() {
		return utente.getNomeEntita();
	}

	@Override
	public void setCognome(final String cognome) {
		utente.setCognome(cognome);
	}

	@Override
	public String getCognome() {
		return utente.getCognome();
	}

	@Override
	public AbstractOggettoEntita getEntitaPadre() {
		return utente;
	}

	@Override
	public void notifyObservers() {
		super.notifyObservers();
	}

	@Override
	protected synchronized void setChanged() {
		super.setChanged();
	}

	@Override
	public AbstractOggettoEntita getEntita() {
		return getEntitaPadre();
	}

}
